package rs.creator;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import rs.domain.RecommendedTrack;
import rs.domain.Track;
import rs.thread.MultiThreadWorker;
import rs.thread.processor.SimilarArtistProcessor;
import rs.util.Requester;
import rs.util.TuningParameters;

/* Classe responsabile della verifica dei brani raccomandati.
 * Per ogni brano raccomandato si verifica che (rispetto all'utente iniziale):
 * 		- non lo ha ascoltato
 * 		- non è tra i suoi preferiti
 * 		- non lo ha bannato
 * Inoltre, per l'autore di ogni brano raccomandato, verifico che (rispetto all'utente iniziale):
 * 		- o è un autore che ascolta
 * 		- o è un autore simile a quelli che ascolta
 * 		- o è un autore ascoltato dagli utenti più simili a lui */
public class RecommendedTracksVerifier {

	public void verify(Requester app, List<RecommendedTrack> rec_tracks, List<Track> ban_tracks, Map<String, List<Track>> user2tracks, Map<String, Double> user2similarity, String user) {
		SimilarArtistProcessor sap = new SimilarArtistProcessor();
		MultiThreadWorker<Track> mtw = new MultiThreadWorker<Track>();
		mtw.compute(sap, user2tracks.get(user));		
		List<String> artists = sap.getResult();	
		
		for (String u : user2similarity.keySet()) {
			if (user2similarity.get(u) >= TuningParameters.MINIMAL_SIMILARITY_FOR_ARTIST) {
				for (Track t : user2tracks.get(u)) {
					if (!artists.contains(t.getArtist())) {
						artists.add(t.getArtist());
					}
				}
			}
		}

		user2tracks.get(user).addAll(ban_tracks);
		List<RecommendedTrack> to_remove = new ArrayList<RecommendedTrack>();
		for (RecommendedTrack rec_tr : rec_tracks) {

			boolean track_match = false;
			for (int i = 0; i < user2tracks.get(user).size() && !track_match; i++) {
				Track user_tr = user2tracks.get(user).get(i);
				if (rec_tr.getTrack().equals(user_tr)) {
					to_remove.add(rec_tr);
					track_match = true;
				}
			}
			
			if (!track_match) {
				boolean artist_match = false;
				for (int i = 0; i < artists.size() && !artist_match; i++) {
					if (rec_tr.getTrack().getArtist().equals(artists.get(i))) {
						artist_match = true;
					}
				}
				
				if (!artist_match) {
					to_remove.add(rec_tr);
				}
			}
		}
		rec_tracks.removeAll(to_remove);
	}

}
